package com.qf.fallback;

import org.springframework.cloud.netflix.zuul.filters.route.FallbackProvider;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.stereotype.Component;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;


//*
// 这个是网关转发请求的时候 如果出现了问题 会执行当期的fallback 但是他有个前提  就是你请求的地址对应的服务他是可以看得到的
//  比如 访问地 服务器关闭了
// 如果 请求的地址在 route 信息中不存在 就直接 报404

// */

@Component
public class Myfallback implements FallbackProvider {

    /*
    * 当那个服务器出现问题的时候 执行当前的fallback 如果是给所有的就返回*
    **/

    @Override
    public String getRoute() {
        return "*";
    }
//      通过当前的方法 返回降级数据
//     现在是哪个服务器出现了问题
//    出现了什么问题
    @Override
    public ClientHttpResponse fallbackResponse(String route, Throwable cause) {


        System.out.println(route+cause.getMessage());

      return new ClientHttpResponse() {
//       要返回的 http 的状态码  根据实际情况或者是异常  或者是路由信息来决定
          @Override
          public HttpStatus getStatusCode() throws IOException {
              return HttpStatus.OK;
          }

          @Override
          public int getRawStatusCode() throws IOException {
              return 200;
          }

          @Override
          public String getStatusText() throws IOException {
              return "OK";
          }

          @Override
          public void close() {

          }

          @Override
          public InputStream getBody() throws IOException {
           String result="这是网关降级的数据";
              ByteArrayInputStream inputStream=new ByteArrayInputStream(result.getBytes(StandardCharsets.UTF_8));


              return inputStream;
          }

          @Override
          public HttpHeaders getHeaders() {

//              如果想要自己设置响应头
              HttpHeaders httpHeaders=new HttpHeaders();
              httpHeaders.add("content-Type","text/html;charset=utf-8");
              httpHeaders.add("suibianxieyigetou","liugegedongxinsile");

              return httpHeaders;
          }
      };

    }
}
